/** 
 * 描述一个对象的类型
 * 不允许重复声明
 */
type myType = {
    name: string,
    age: number,
    // [propName: string]: any,
}

const obj: myType = {
    name: "张三",
    age: 18,
};

/** 
 * 定义接口
 * 定义一个类中应该包含哪些属性和方法
 * 允许重复声明
 * 同名会合并
 * 接口可以在定义类的时候去限制类的使用
 * 接口中的所有属性都不能有实际的值
 * 接口只定义对象的结构，而不考虑实际的值
 */
interface myInterface {
    name: string;
    age: number;
}
interface myInterface {
    color: string;
}

const obj2: myInterface = {
    name: "李四",
    age: 22,
    color: "red",
};

interface myInterface2 {
    name: string;
    sayHello(): void;
}

/** 
 * 定义类时，可以使类去实现一个接口
 * 实现接口就是使类满足接口的要求
 * 接口只有抽象方法
 */
class MyClass implements myInterface2 {
    name: string;
    constructor(name: string) {
        this.name = name;
    }
    sayHello(): void {
       console.log('你好啊');
    }
}